package com.csw.mysqldate.exception;


import com.csw.mysqldate.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.sql.SQLException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 【全局异常处理】
 * 注意这边是RestControllerAdvice  不是ControllerAdvice
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @Autowired
    private HttpServletRequest httpServletRequest;

    @ExceptionHandler(Throwable.class)
    public Result<String> handleException(Throwable e) {
        // 在这里可以进行异常处理逻辑，例如记录日志、发送错误报告等
        String requestURI = httpServletRequest.getRequestURI();

        /**
         * 比如get请求用post进行调用
         */
        if (e instanceof HttpRequestMethodNotSupportedException) {
            log.error("请求地址'{}',【请求方式不被允许】'{}'", requestURI, e);
            return Result.err("请求方式不被允许" + e.getMessage());
        }

        /**
         * 参数入参检查异常,比如用了@Notnull
         */
        if (e instanceof MethodArgumentNotValidException) {
            List<ObjectError> allErrors = ((MethodArgumentNotValidException) e).getBindingResult().getAllErrors();
            List<String> strList = allErrors.stream().map(c -> c.getDefaultMessage()).collect(Collectors.toList());
            log.error("请求地址'{}',【参数入参检查异常】'{}'", requestURI, e);
            return Result.err("参数入参检查异常" + strList.toString());
        }

        /**
         * Exception下
         * RuntimeException下
         * 自定义业务异常
         */
        if (e instanceof BusinessException) {
            log.error("请求地址'{}',【业务异常】'{}'", requestURI, e);
            return Result.err("业务异常" + e.getMessage());
        }

        /**
         * Exception下
         * RuntimeException下
         * 空指针异常
         */
        if (e instanceof NullPointerException) {
            log.error("请求地址'{}',【空指针异常】'{}'", requestURI, e);
            return Result.err("空指针异常" + e.getMessage());
        }

        /**
         * Exception下
         *  RuntimeException下
         *  IndexOutOfBoundsException下
         * 数组越界异常
         */
        if (e instanceof ArrayIndexOutOfBoundsException) {
            log.error("请求地址'{}',【数组越界异常】'{}'", requestURI, e);
            return Result.err("数组越界异常" + e.getMessage());
        }


        /**
         * Exception下
         * RuntimeException下
         * 类型转换异常
         */
        if (e instanceof ClassCastException) {
            log.error("请求地址'{}',【类型转换异常】'{}'", requestURI, e);
            return Result.err("类型转换异常" + e.getMessage());
        }

        /**
         * Exception下
         * RuntimeException下
         * 算术异常
         */
        if (e instanceof ArithmeticException) {
            log.error("请求地址'{}',【算术异常】'{}'", requestURI, e);
            return Result.err("算术异常" + e.getMessage());
        }

        /**
         * Exception下
         * IOException下
         * 文件未找到异常
         */
        if (e instanceof FileNotFoundException) {
            log.error("请求地址'{}',【文件未找到异常】'{}'", requestURI, e);
            return Result.err("文件未找到异常" + e.getMessage());
        }

        /**
         * Exception下
         * IOException下
         * 文件结束异常
         */
        if (e instanceof EOFException) {
            log.error("请求地址'{}',【文件结束异常】'{}'", requestURI, e);
            return Result.err("文件结束异常" + e.getMessage());
        }
        /**
         * Exception下
         * ReflectiveOperationException下
         * 类未找到异常
         */
        if (e instanceof ClassNotFoundException) {
            log.error("请求地址'{}',【类未找到异常】'{}'", requestURI, e);
            return Result.err("类未找到异常" + e.getMessage());
        }

        /**
         * Exception下
         * 数据库异常
         */
        if (e instanceof SQLException) {
            log.error("请求地址'{}',【数据库异常】'{}'", requestURI, e);
            return Result.err("数据库异常" + e.getMessage());
        }
        /**
         * Exception下
         * 并发异常
         */
        if (e instanceof InterruptedException) {
            log.error("请求地址'{}',【并发异常】'{}'", requestURI, e);
            return Result.err("并发异常" + e.getMessage());
        }

        /**
         * 错误
         */
        if (e instanceof Error) {
            log.error("请求地址'{}',【系统发生严重错误】'{}'", requestURI, e);
            return Result.err("系统发生严重错误" + e.getMessage());
        }

        //放最后
        log.error("请求地址'{}',【异常】'{}'", requestURI, e);
        return Result.err("异常" + e.getMessage());

    }
}